Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit d8a5c2b480135606d368af6a3c2ed1cec6ded739


Parents : 1bbf6c5
Author : Mark Qvist <bc7291552be7a58f361522990465165c>
Signature : T66BB85Valid, signed by author
Date : 2026-07-16T22:14:14+02:00

Improved UI job scheduling

Changes

2 files changed, 32 insertions(+), 10 deletions(-)

M sbapp/main.py +28 -4

Diff

diff --git a/sbapp/main.py b/sbapp/main.py
index bdcbcc6e..00221bc3 100644
--- a/sbapp/main.py
+++ b/sbapp/main.py
@@ -529,6 +529,8 @@ class SidebandApp(MDApp):
self.shaders_disabled = __disable_shaders__
self.keyboard_enabled = False
self.console_attached = False
+ self.jobs_scheduler = None
+ self.last_jobs_run = 0
self.no_transition = NoTransition()
self.slide_transition = SlideTransition()
@@ -632,14 +634,26 @@ class SidebandApp(MDApp):
self.start_final()
self.loading_updater.cancel()
+ def ensure_jobs(self, pre_sleep=6.0):
+ def job():
+ time.sleep(pre_sleep)
+ if time.time()-self.last_jobs_run > 2+pre_sleep:
+ if self.jobs_scheduler:
+ RNS.log(f"Stopping stale job scheduler...")
+ self.jobs_scheduler.cancel()
+
+ RNS.log(f"Starting UI jobs scheduler...")
+ self.jobs_scheduler = Clock.schedule_interval(self.jobs, 1.5)
+
+ threading.Thread(target=job, daemon=True).start()
+
def start_core(self, dt):
self.loading_updater = Clock.schedule_interval(self.update_init_status, 0.1)
self.check_permissions()
self.check_bluetooth_permissions()
self.start_service()
-
- Clock.schedule_interval(self.jobs, 1.5)
+ self.ensure_jobs(pre_sleep=0.0)
def dismiss_splash(dt):
from android import loadingscreen
@@ -681,25 +695,34 @@ class SidebandApp(MDApp):
toast(f"Restarting RNS service...")
if hasattr(self, "connectivity_screen") and self.connectivity_screen != None:
self.connectivity_screen.ids.button_service_restart.disabled = True
+ if hasattr(self, "object_details_screen") and self.object_details_screen != None:
+ self.object_details_screen.ids.use_interface_button.disabled = True
def job():
RNS.log(f"Executing service restart")
+ self.app_state = SidebandApp.ACTIVE
if self.restart_service():
RNS.log("Service restarted successfully")
def tj(delta_time):
toast(f"Service restarted successfully")
if hasattr(self, "connectivity_screen") and self.connectivity_screen != None:
self.connectivity_screen.ids.button_service_restart.disabled = False
+ if hasattr(self, "object_details_screen") and self.object_details_screen != None:
+ self.object_details_screen.ids.use_interface_button.disabled = False
Clock.schedule_once(tj, 0.1)
if self.app_state == SidebandApp.ACTIVE:
+ RNS.log(f"Re-initializing app state")
self.sideband.setstate("app.running", True)
self.sideband.setstate("app.foreground", True)
self.sideband.setstate("wants.clear_notifications", True)
+ self.ensure_jobs()
else:
RNS.log("Service restart failed")
def tj(delta_time):
toast(f"Service restart failed")
if hasattr(self, "connectivity_screen") and self.connectivity_screen != None:
self.connectivity_screen.ids.button_service_restart.disabled = False
+ if hasattr(self, "object_details_screen") and self.object_details_screen != None:
+ self.object_details_screen.ids.use_interface_button.disabled = True
Clock.schedule_once(tj, 0.1)
threading.Thread(target=job, daemon=True).start()
@@ -1153,9 +1176,9 @@ class SidebandApp(MDApp):
if RNS.vendor.platformutils.is_android():
RNS.log("Performing app wake UI update", RNS.LOG_DEBUG)
self.root.ids.nav_drawer.set_state("open")
- def cb(dt):
- self.root.ids.nav_drawer.set_state("closed")
+ def cb(dt): self.root.ids.nav_drawer.set_state("closed")
Clock.schedule_once(cb, 0)
+ self.ensure_jobs(pre_sleep=8.0)
def has_location_permissions(self):
if RNS.vendor.platformutils.is_android():
@@ -1495,6 +1518,7 @@ class SidebandApp(MDApp):
props = []
def jobs(self, delta_time):
+ self.last_jobs_run = time.time()
if self.final_load_completed:
if RNS.vendor.platformutils.is_android() and not self.sideband.service_available():
if time.time() - self.service_last_available > SidebandApp.SERVICE_TIMEOUT:

diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py
index e7b23693..22300223 100644
--- a/sbapp/sideband/core.py
+++ b/sbapp/sideband/core.py
@@ -2961,6 +2961,7 @@ class SidebandCore():
if cleaned_old: RNS.log(f"Cleaned {cleaned_old} expired telemetry entries", RNS.LOG_NOTICE)
if cleaned_future: RNS.log(f"Cleaned {cleaned_future} telemetry entries with timestamps too far in the future", RNS.LOG_NOTICE)
+ RNS.log("Telemetry cleaning done", RNS.LOG_NOTICE)
def _db_message_set_state(self, lxm_hash, state, is_retry=False, ratchet_id=None, originator_stamp=None):
msg_extras = None
@@ -4248,12 +4249,9 @@ class SidebandCore():
return None
def __start_jobs_immediate(self):
- if self.log_quiet:
- selected_level = 0
- elif self.log_verbose:
- selected_level = 6
- else:
- selected_level = 2
+ if self.log_quiet: selected_level = 0
+ elif self.log_verbose: selected_level = 6
+ else: selected_level = 2
self.setstate("init.loadingstate", "Substantiating Reticulum")


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────